/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.clases;

import au.com.bytecode.opencsv.CSVReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalTime;

/**
 * Clase que carga los trayectos, ciudades, medioTransporte y horas de ficheros Csv
 * @author David & Alejandro
 */
public class CargaCsv {
    private List<Ciudad> ciudades;
    private List<InterfazMedioTransporte> mediosTransportes;
    private List<Trayecto> trayectos;
    private List<Hora> horas;


    /**
     * Constructor que carga los datos de ficheros Csv.
     * @param nombreArchivoMediosTransportes Fichero que contiene la información de los mediosTransportes.
     * @param camposLíneaMínimoMediosTransportes Número de campos mínimos que debe tener cada línea de medioTransporte.
     * @param nombreArchivoTrayectos Fichero que contiene la información de los trayectos.
     * @param camposLíneaMínimoTrayectos Número de campos mínimos que debe tener cada línea de trayecto.
     */
    public CargaCsv (String nombreArchivoMediosTransportes,int camposLíneaMínimoMediosTransportes, String nombreArchivoTrayectos,int camposLíneaMínimoTrayectos) throws FileNotFoundException, IOException{

            //Inicialista las listas
            this.ciudades = new ArrayList<Ciudad> ();
            this.trayectos = new ArrayList<Trayecto> ();
            this.horas = new ArrayList<Hora> ();
            this.mediosTransportes = new ArrayList<InterfazMedioTransporte> ();

            //Carga archivo de medioTransporte
            List<String[] > líneasMediosTransportes = leeCsv(nombreArchivoMediosTransportes, camposLíneaMínimoMediosTransportes);
            for(String [] nextLine : líneasMediosTransportes){

                InterfazMedioTransporte medioTransporte = new Tren(nextLine[0],Integer.parseInt(nextLine[1]), Double.parseDouble(nextLine[2]));

                if(! this.mediosTransportes.contains(medioTransporte)){
                    this.mediosTransportes.add(medioTransporte);
                }
            }


            //Carga archivo de Trayectos
            List<String[] > líneas = leeCsv(nombreArchivoTrayectos, camposLíneaMínimoTrayectos);
            for(String [] nextLine : líneas){

                Ciudad ciudadOrigen = new Ciudad(nextLine[1]);

                if(! this.ciudades.contains(ciudadOrigen)){
                    this.ciudades.add(ciudadOrigen);
                }

                Ciudad ciudadDestino = new Ciudad(nextLine[2]);

                if(! this.ciudades.contains(ciudadDestino)){
                    this.ciudades.add(ciudadDestino);
                }

                Trayecto trayecto = new Trayecto(Integer.parseInt(nextLine[3]), ciudadOrigen,ciudadDestino);

                if(! this.trayectos.contains(trayecto)){
                    this.trayectos.add(trayecto);
                }

                //Obtenemos el medio de transporte para la hora
                InterfazMedioTransporte medioTransporteExistente = null;
                for(InterfazMedioTransporte medioTransporte : this.mediosTransportes){
                    if(medioTransporte.existeMedioTransporte(nextLine[0])){
                        medioTransporteExistente = medioTransporte;
                    }
                }

                if(medioTransporteExistente != null){
                       for(int i=4; i < nextLine.length;i+=2){
                           Hora hora = new Hora(new LocalTime(nextLine[i]),new LocalTime(nextLine[i+1]), medioTransporteExistente, trayecto);
                           if (! this.horas.contains(hora)){
                               this.horas.add(hora);
                           }
                         
                       }
                 }

            }


    }

    /**
     * Función que lee un fichero Csv comprobando que las líneas tenga un mínimo de campos y eliminando los espacios en blanco innecesarios.
     * @param nombreArchivo Fichero Csv a leer.
     * @param camposLíneaMínimo Número de campos mínimos que debe tener una línea
     * @return Devuelve una lista de vectores de String.
     */
    private List<String []> leeCsv (String nombreArchivo, int camposLíneaMínimo) throws FileNotFoundException, IOException{
        List<String []> líneas = new ArrayList<String []> ();

       //Lectura del fichero
       CSVReader reader = new CSVReader(new FileReader(nombreArchivo));
       String [] nextLine;
       while ((nextLine = reader.readNext()) != null) {

         //comprueba que la línea tenga el mínimo de campos necesarios.
         if (nextLine.length >= camposLíneaMínimo){

            //Elimina espacios en blancos innecesarios en las palabras.
            for (int i = 0; i < nextLine.length; i++){
                nextLine[i] = nextLine[i].trim();
            }

            líneas.add(nextLine);

         }

        }

        return líneas;
    }

    /**
     * Método que obtiene las horas de los viajes existentes en el sistema.
     * @return horas
     */
    public List<Hora> obtieneHoras() {
        return horas;
    }
}
